package cn.lixin.user.service.impl;

import cn.lixin.basic.exception.BusinessException;
import cn.lixin.basic.utils.StrUtils;
import cn.lixin.user.contain.UserConstants;
import cn.lixin.user.domain.User;
import cn.lixin.user.mapper.UserMapper;
import cn.lixin.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void send(Map<String,String> param) {
        String phone = param.get("phone"); // {"phone":this.phoneUserForm.phone}
        String type = param.get("type");
        // 校验是否为空
        if (phone.isEmpty() || type.isEmpty()){
            throw new BusinessException("信息不能为空");
        }

        // 校验是否已注册
        User user = userMapper.loadByPhone(phone);
        if (user != null){ // 已注册
            throw new BusinessException("已注册，请直接登录或者找回密码");
        }
        // 根据不同的业务发送
        String bussinessCode = "";
        if (type.equals("register")){
            bussinessCode = UserConstants.BUSINESS_REGISTER_PREFIX + phone;
        }   else if (type.equals("binder")){
            bussinessCode = UserConstants.BUSINESS_BINDER_PREFIX + phone;
        }
        sendCode(bussinessCode);
    }
    /*
        发送验证码的方法
     */
    public void sendCode(String bussinessCode){
          /* 验证码存入redis，get方法获取，set方法取出
            {固定前缀:电话号码,验证码:时间戳}  {k,v}*/
        // 通过查询redis的get key方法 获取验证码
        Object codeTemp = redisTemplate.opsForValue().get(bussinessCode);
        String code = "";
        if (codeTemp != null){ // 如果能获取到验证码，说明已经发送了
            //根据验证码时间判断是否有效
            String timeTemp = codeTemp.toString().split(":")[1]; // 获取发送验证码的时间
            long time = System.currentTimeMillis() - Long.valueOf(timeTemp); // 和当前时间相减
            if (time <= 1*60*1000){ // 一分钟
                throw new BusinessException("请勿绕过前端重复点击");
            }
            // 大于一分钟，说明一直没收到，将之前的验证码加上现在的时间重新发送一次
            code = codeTemp.toString().split(":")[0];
        }else {
            // 获取不到验证码说明没有发送过，
            // 生成验证码
            code = StrUtils.getComplexRandomString(6);
        }
        // 将验证码存入redis中并且设置k,v,l,unit
        redisTemplate.opsForValue().set(bussinessCode,
                code+":"+System.currentTimeMillis(),
                3, TimeUnit.MINUTES );
        // 发送验证码
//       SMSUtil.send(phone,"【测试】验证码：" + code + "，请确认本人操作，三分钟内有效。");
        System.out.println("【测试】验证码：" + code + "，请确认本人操作，三分钟内有效。");
    }
}


/*        if (phone == null){
            throw new BusinessException("手机号不能为空");
        }
        // user
        User user = userMapper.loadByPhone(phone);
        if (user != null){
            throw new BusinessException("已注册");
        }
        // 正常情况 尝试去redis拿验证码
        Object codeTemp = redisTemplate.opsForValue().
                get(UserConstants.BUSINESS_REGISTER_PREFIX + phone);// 根据key获取value: codeTemp=code+时间
        String code = "";
        if (codeTemp != null) { // 拿到了 说明发送过了需要判断时间
            String timeStr = codeTemp.toString().split(":")[1];
            Long timeOld = Long.valueOf(timeStr);
            if (System.currentTimeMillis() - timeOld <= 1*60*1000){
                throw new BusinessException("你跳过前端重复点击了");
            }
            // 大于1分钟说明 发送了但是他没收到
            // 获取之前的验证码，加上现在的时间 codeTemp=code+时间
            code = codeTemp.toString().split(":")[0];
        }else {
            // redis中没有 说明第一次注册，随机4位
            code = StrUtils.getComplexRandomString(4);
        }
        SMSUtil.send(phone,"验证码为：" + code);

        // 保存到redis
        redisTemplate.opsForValue().set(UserConstants.BUSINESS_REGISTER_PREFIX+phone,
                code+":"+System.currentTimeMillis(),
                3,TimeUnit.MINUTES);*/


